package com.example.excel_db.service;

import com.example.excel_db.dto.ExcelTemplateDTO;
import com.example.excel_db.dto.ExcelTemplateFieldDTO;
import com.example.excel_db.entity.ExcelTemplate;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * Excel模板服务接口
 */
public interface ExcelTemplateService {

    /**
     * 创建Excel模板
     *
     * @param templateDTO 模板DTO
     * @return 创建后的模板DTO
     */
    ExcelTemplateDTO createTemplate(ExcelTemplateDTO templateDTO);

    /**
     * 更新Excel模板
     *
     * @param templateDTO 模板DTO
     * @return 更新后的模板DTO
     */
    ExcelTemplateDTO updateTemplate(ExcelTemplateDTO templateDTO);

    /**
     * 删除Excel模板
     *
     * @param id 模板ID
     */
    void deleteTemplate(Long id);

    /**
     * 根据ID获取模板
     *
     * @param id 模板ID
     * @return 模板DTO
     */
    ExcelTemplateDTO getTemplateById(Long id);

    /**
     * 根据名称获取模板
     *
     * @param name 模板名称
     * @return 模板DTO
     */
    ExcelTemplateDTO getTemplateByName(String name);

    /**
     * 获取所有模板
     *
     * @return 模板DTO列表
     */
    List<ExcelTemplateDTO> getAllTemplates();

    /**
     * 分页获取模板
     *
     * @param pageable 分页参数
     * @return 模板DTO分页结果
     */
    Page<ExcelTemplateDTO> getTemplates(Pageable pageable);

    /**
     * 添加模板字段
     *
     * @param templateId 模板ID
     * @param fieldDTO 字段DTO
     * @return 添加后的字段DTO
     */
    ExcelTemplateFieldDTO addTemplateField(Long templateId, ExcelTemplateFieldDTO fieldDTO);

    /**
     * 更新模板字段
     *
     * @param fieldDTO 字段DTO
     * @return 更新后的字段DTO
     */
    ExcelTemplateFieldDTO updateTemplateField(ExcelTemplateFieldDTO fieldDTO);

    /**
     * 删除模板字段
     *
     * @param fieldId 字段ID
     */
    void deleteTemplateField(Long fieldId);

    /**
     * 获取模板字段列表
     *
     * @param templateId 模板ID
     * @return 字段DTO列表
     */
    List<ExcelTemplateFieldDTO> getTemplateFields(Long templateId);

    /**
     * 上传模板文件
     *
     * @param templateId 模板ID
     * @param file 模板文件
     * @return 更新后的模板DTO
     */
    ExcelTemplateDTO uploadTemplateFile(Long templateId, MultipartFile file);

    /**
     * 下载模板文件
     *
     * @param templateId 模板ID
     * @return 模板文件字节数组
     */
    byte[] downloadTemplateFile(Long templateId);

    /**
     * 生成空白模板文件
     *
     * @param templateId 模板ID
     * @return 模板文件字节数组
     */
    byte[] generateEmptyTemplateFile(Long templateId);

    /**
     * 根据实体对象转换为DTO
     *
     * @param template 模板实体
     * @return 模板DTO
     */
    ExcelTemplateDTO convertToDTO(ExcelTemplate template);
}